Java学习

您所在的位置:网站首页 java 画图库 Java学习

Java学习

2024-07-08 12:28| 来源: 网络整理| 查看: 265

近期通过学习java,进行画图程序的编写,记录并巩固对Java的学习。

首先进行包以及类的创建,如下:

并在跟目录下创建lib文件夹,从资源包粘贴外部Jar包:

右键

构建路径——配置构建路径

成功导入。

对DrawPictureCanvas.java进行编辑:

本内容是开发画图程序,需要给窗体添加可以绘画的虚拟画布

package com.mr.draw; import java.awt.Canvas; import java.awt.Graphics; import java.awt.Image; //简笔画展示窗口 public class DrawPictureCanvas extends Canvas{ private Image image = null; public void setImage(Image image) { this.image = image; } //重写paint()方法,在画布上绘制图像 public void paint(Graphics g) {//调用java的绘图对象 g.drawImage(image,0,0,null);//在画布上绘制图像 } //重写paint()方法,在画布上绘制图像 //绘图发生变化的时候调用 public void update(Graphics g) { paint(g); } }//DrawPictureCanvas类结束 对DrawPictureFrame.java进行编辑: 添加画笔以及工具栏 package com.mr.draw; import java.awt.Color; import java.awt.image.BufferedImage; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.JFrame; //Graphics联系使用不同的方法实现不同图像的绘制,如:drawLine()方法可以绘制直线,drawRect()方法可以绘制矩形 //Graphics2D包含Graphics并且加强过:可以使用不同的类来表示不同的形状如line2D直线类 //鼠标 import java.awt.event.MouseAdapter;//鼠标监听实现类 import java.awt.event.MouseEvent;//鼠标事件 import java.awt.event.MouseMotionAdapter;//鼠标移动监听 //工具栏 import java.awt.BorderLayout;//窗体布局 import javax.swing.ButtonGroup;//按钮组 import javax.swing.JButton;//按钮类 import javax.swing.JToggleButton;//可以显示状态的按钮 import javax.swing.JToolBar;//工具栏 //画笔 import java.awt.BasicStroke;//基本画笔 import java.awt.event.ActionEvent;//动作事件 import java.awt.event.ActionListener;//动作监听 //颜色选择对话框 import javax.swing.JColorChooser; //绘制图形功能 import java.awt.geom.Ellipse2D;//圆形 import java.awt.geom.Rectangle2D;//方形 import com.mr.util.FrameGetShape;//窗体获取图形的接口 import com.mr.util.ShapeWindow;//选择图形的小节面 import com.mr.util.Shapes;//图形的类 /** * draw(Shape form)绘制空心形状 * fill(shape form)实心 form是指实现shape接口的对象 * Ellipse2D 描述窗体矩形定义的椭圆 * Rectangle2D 描述通过位置和尺寸定义的矩形 */ //保存图片 import com.mr.util.DrawImageUtil; public class DrawPictureFrame extends JFrame implements FrameGetShape{//继承窗体类 //创建一个8位BGR颜色分量的图像 BufferedImage image =new BufferedImage(570,390,BufferedImage.TYPE_INT_BGR); Graphics gs=image.getGraphics();//获得图像的绘画对象 Graphics2D g=(Graphics2D) gs; //获得绘画对象转换为Graphics2D类型 DrawPictureCanvas canvas =new DrawPictureCanvas();//创建画布对象 Color foreColor=Color.BLACK;//定义前景色 棕色 Color backgroundColor =Color.WHITE; //定义背景色 白色 //鼠标事件 int x=-1; //上次鼠标绘制点的横坐标 int y=-1; //上次鼠标绘制点的纵坐标 boolean rubber=false; //橡皮标识变量 private JToolBar toolBar;//工具栏 private JButton eraserButton;//橡皮 private JToggleButton strokeButton1;//细线按钮 private JToggleButton strokeButton2;//粗线按钮 private JToggleButton strokeButton3;//较粗按钮 private JButton backgroundButton;//背景色按钮 private JButton foregroundButton;//前背景色按钮 private JButton clearButton;//清除按钮 private JButton saveButton;//保存按钮 private JButton shapeButton;//图像按钮 boolean drawShape =false;//画图形标志变量 Shapes shape;//绘制图形 /** * 构造方法,添加组件的初始化方法 */ public DrawPictureFrame() { setResizable(false); //窗体不能改变大小 setTitle("画图程序"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗口关闭则停止程序 setBounds(500,100,574,460); //设置窗口位置 Bounds:边界 init(); //组件初始化 init(); addListener(); //添加组件监听 }//DrawPictureFrame()结束 /** * 组件初始化 */ private void init() { g.setColor(backgroundColor);//用背景色设置绘图对象的颜色 g.fillRect(0, 0, 570, 390);//使用背景色填充整个画布 g.setColor(foreColor); //设置画布的图像 canvas.setImage(image);//设置画布的图像 getContentPane().add(canvas);//将画布添加到窗体容器默认布局的中部位置 toolBar =new JToolBar();//初始化工具栏 getContentPane().add(toolBar,BorderLayout.NORTH);//工具栏放至船体北方 saveButton=new JButton("保存");//初始化按钮对象,并添加文本内容 toolBar.add(saveButton);//工具栏添加按钮 toolBar.addSeparator();//添加分割线 //初始化有选中状态的按钮对象,并添加文本 strokeButton1 =new JToggleButton("细线"); strokeButton1.setSelected(true);//细线按钮处于选中状态 toolBar.add(strokeButton1);//工具栏添加按钮 strokeButton2 =new JToggleButton("粗线"); toolBar.add(strokeButton2);//工具栏添加按钮 strokeButton3 =new JToggleButton("较粗"); //把上面三个按顺序,画笔粗细按钮组,保证同时只有一个按钮被选中 ButtonGroup strokeGroup =new ButtonGroup(); strokeGroup.add(strokeButton1);//按钮组添加按钮 strokeGroup.add(strokeButton2); strokeGroup.add(strokeButton3); toolBar.add(strokeButton3);//工具栏添加按钮 toolBar.addSeparator();//添加分割线 backgroundButton=new JButton("背景颜色");//初始化按钮对象,并添加文本内容 toolBar.add(backgroundButton);//工具栏添加按钮 foregroundButton =new JButton("画笔颜色"); toolBar.add(foregroundButton); toolBar.addSeparator();//添加分割线 shapeButton =new JButton("图形"); toolBar.add(shapeButton); clearButton =new JButton("清除"); toolBar.add(clearButton); eraserButton =new JButton("橡皮"); toolBar.add(eraserButton);//工具栏添加按钮 }//init()结束 //实现工具栏功能 实现工具栏功能 }//init()结束 /** * 为组件添加鼠标移动事件监听 */ private void addListener() { //画板添加鼠标移动事件监听 canvas.addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(final MouseEvent e) { //当鼠标拖拽时 if(x>0 && y>0) { //如果x和y存在鼠标记录 if(rubber) { //橡皮标识为true,表示使用橡皮 g.setColor(backgroundColor); //绘图工具使用背景色 g.fillRect(x, y,10,10);//在鼠标划过的位置画填充的正方形 }else { g.drawLine(x, y,e.getX(),e.getY());//在鼠标划过的位置画直线 } }//if结束 x=e.getX(); y=e.getY(); canvas.repaint(); //更新画布 } }); canvas.addMouseListener(new MouseAdapter() {//画板添加鼠标单击事件监听 public void mouseReleased(final MouseEvent arg0) {//当按键抬起时 x=-1; //将记录上一次鼠标绘制点的横坐标恢复成-1 y=-1; //将记录上一次鼠标绘制点的纵坐标恢复成-1 }//mouseReleased结束 //添加鼠标按下时触发的方法,图形 public void mousePressed(MouseEvent e) { if (drawShape) {//如果此时我鼠标画的是图形 switch(shape.getType()) {//判断图形的种类 case Shapes.YUAN://如果是圆形 //计算坐标,让鼠标处于图形的中心位置 int yuanX =e.getX() -shape.getWidth()/2; int yuanY =e.getY() -shape.getHeigth()/2; //创建圆形,并指定坐标和宽高 Ellipse2D yuan=new Ellipse2D.Double(yuanX,yuanY,shape.getWidth(),shape.getHeigth()); g.draw(yuan);//画图工具画此圆形 break; case Shapes.FANG: //计算坐标,让鼠标处于图形的中心位置 int fangX =e.getX() -shape.getWidth()/2; int fangY =e.getY() -shape.getHeigth()/2; //创建方形,并指定坐标和宽高 Rectangle2D fang =new Rectangle2D.Double(fangX,fangY,shape.getWidth(),shape.getHeigth()); g.draw(fang); break; } canvas.repaint();//更新画笔 //画图形标识变量为false ,说明选择鼠标画的是图形 drawShape=false;//画完图形之后,回到画笔状态 } }//图形结束 });//结束canvas.addMouseListener strokeButton1.addActionListener(new ActionListener() {//"细线“按钮添加动作监听 public void actionPerformed(final ActionEvent arg0) {//单击时 //声明画笔属性,粗细为1像素,线条末端无修饰,折线处呈尖角 BasicStroke bs =new BasicStroke(1,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER); g.setStroke(bs);//画图工具使用此画笔 } }); strokeButton2.addActionListener(new ActionListener() {//"细线“按钮添加动作监听 public void actionPerformed(final ActionEvent arg0) {//单击时 //声明画笔属性,粗细为2像素,线条末端无修饰,折线处呈尖角 BasicStroke bs =new BasicStroke(2,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER); g.setStroke(bs);//画图工具使用此画笔 } }); strokeButton3.addActionListener(new ActionListener() {//"细线“按钮添加动作监听 public void actionPerformed(final ActionEvent arg0) {//单击时 //声明画笔属性,粗细为3像素,线条末端无修饰,折线处呈尖角 BasicStroke bs =new BasicStroke(3,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER); g.setStroke(bs);//画图工具使用此画笔 } }); //背景颜色 backgroundButton.addActionListener(new ActionListener() {//背景色按钮添加动作监听:ActionListener public void actionPerformed(final ActionEvent arg0) { //单击时打开颜色对话框,参数依次为:父窗体,标题,默认选中的颜色(青色) Color bgColor =JColorChooser.showDialog(DrawPictureFrame.this,"颜色对话框",Color.CYAN); if (bgColor !=null) {//如果选中的颜色不是空的 backgroundColor=bgColor;//将选中的颜色赋给背景色变量 } //背景色按钮也更换为这种颜色 backgroundButton.setBackground(backgroundColor); g.setColor(backgroundColor);//绘图工具使用颜色 g.fillRect(0,0,570,390);//画一个背景颜色的方形填满整个画布 g.setColor(foreColor);//画图工具使用前景色 canvas.repaint();//更新画布 } });//backgroundButton.addActionListener结束 //画笔颜色--前景色 foregroundButton.addActionListener(new ActionListener() {//背景色按钮添加动作监听:ActionListener public void actionPerformed(final ActionEvent arg0) { //单击时打开颜色对话框,参数依次为:父窗体,标题,默认选中的颜色(青色) Color fColor =JColorChooser.showDialog(DrawPictureFrame.this,"颜色对话框",Color.CYAN); if (fColor !=null) {//如果选中的颜色不是空的 foreColor=fColor;//将选中的颜色赋给背景色变量 } //背景色按钮也更换为这种颜色 foregroundButton.setBackground(foreColor); g.setColor(foreColor);//绘图工具使用颜色 } }); //清除与橡皮按钮事件实现 clearButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent arg0) { g.setColor(backgroundColor); g.fillRect(0,0,570,390);//画一个背景颜色的方形填满整个画布,实现清除功能 g.setColor(foreColor);//画图工具使用画笔颜色 canvas.repaint();//更新画布 } }); eraserButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent arg0) { //单击按钮,使用橡皮 if (eraserButton.getText().equals("橡皮")) { rubber =true; //设置橡皮为true eraserButton.setText("画图");//改变按钮上的文字为画图 eraserMenuItem.setText("画图"); }else { rubber =false; //设置画笔为false eraserMenuItem.setText("橡皮"); eraserButton.setText("橡皮"); g.setColor(foreColor);//设置绘图对象为画笔颜色 } } });//橡皮结束 //图形 shapeButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {//单击时 ShapeWindow shapeWindow=new ShapeWindow(DrawPictureFrame.this);//创建图形选择组件 int shapeButtonWidth = shapeButton.getWidth();//获取图形按钮宽度 int shapeWindowWidth = shapeWindow.getWidth();//获取图形按钮高度 int shapeButtonX =shapeButton.getX();//获取图形按钮横坐标 int shapeButtonY =shapeButton.getY();//获取图形按钮纵坐标 //计算图形组件横坐标,让组件与“图形”按钮居中对齐 int shapeWindowX =getX() +shapeButtonX-(shapeWindowWidth -shapeButtonWidth)/2; //计算图形组件纵坐标,让组件与“图形”按钮下方 int shapeWindowY =getY()+shapeButtonY+80; //设置图形组件坐标位置 shapeWindow.setLocation(shapeWindowX,shapeWindowY); shapeWindow.setVisible(true);//图形可见 } });//图形结束 //保存图片 saveButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent argo) {//单击时 DrawImageUtil.saveImage(DrawPictureFrame.this,image);//打印图片:打印当前窗体(DrawPictureFrame.this)为图片 } }); /** * 菜单监听,基本和前面的一样,修改为saveMenuItem. */ saveMenuItem.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent argo) {//单击时 DrawImageUtil.saveImage(DrawPictureFrame.this,image);//打印图片:打印当前窗体(DrawPictureFrame.this)为图片 } }); //清除与橡皮按钮事件实现 clearMenuItem.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent arg0) { g.setColor(backgroundColor); g.fillRect(0,0,570,390);//画一个背景颜色的方形填满整个画布,实现清除功能 g.setColor(foreColor);//画图工具使用画笔颜色 canvas.repaint();//更新画布 } }); eraserMenuItem.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent arg0) { //单击按钮,使用橡皮 if (eraserButton.getText().equals("橡皮")) { rubber =true; //设置橡皮为true eraserButton.setText("画图");//改变按钮上的文字为画图 eraserMenuItem.setText("画图"); }else { rubber =false; //设置画笔为false eraserMenuItem.setText("橡皮");//改变菜单项的文本为橡皮 eraserButton.setText("橡皮"); g.setColor(foreColor);//设置绘图对象为画笔颜色 } } });//橡皮结束 //背景颜色 backgroundMenuItem.addActionListener(new ActionListener() {//背景色按钮添加动作监听:ActionListener public void actionPerformed(final ActionEvent arg0) { //单击时打开颜色对话框,参数依次为:父窗体,标题,默认选中的颜色(青色) Color bgColor =JColorChooser.showDialog(DrawPictureFrame.this,"颜色对话框",Color.CYAN); if (bgColor !=null) {//如果选中的颜色不是空的 backgroundColor=bgColor;//将选中的颜色赋给背景色变量 } //背景色按钮也更换为这种颜色 backgroundButton.setBackground(backgroundColor); g.setColor(backgroundColor);//绘图工具使用颜色 g.fillRect(0,0,570,390);//画一个背景颜色的方形填满整个画布 g.setColor(foreColor);//画图工具使用前景色 canvas.repaint();//更新画布 } });//backgroundButton.addActionListener结束 //FrameGetShape接口实现类,用于获得图形空间返回的被选中的图形 @Override public void getShape(Shapes shape) { this.shape =shape;//将反回的图形对象赋给类的全局变量 drawShape =true; //画图形标识变量为true,声明现在鼠标画的是图形,而不是线条 }//结束 public static void main(String[] args) { DrawPictureFrame frame=new DrawPictureFrame();//创建窗体对象 frame.setVisible(true);//让窗口可见 }//main()结束 //主类结束 实现菜单及功能 package com.mr.draw;         /**         * 略略略略略略略         */ //添加菜单栏组件 import javax.swing.JMenuBar;//菜单栏,像工具栏一样,相当于一个底座功能。蒋添加的菜单都显示在窗体上 import javax.swing.JMenu;//菜单,显示在菜单栏中,可以单击弹出菜单项 import javax.swing.JMenuItem;//菜单项,可以触发点击事件,实现具体功能 /** * 略略略略略略略 */ //菜单 private JMenuItem strokeMenuItem1;//细线菜单 private JMenuItem strokeMenuItem2;//粗线菜单 private JMenuItem strokeMenuItem3;//较粗 private JMenuItem clearMenuItem;//清除菜单 private JMenuItem foregroundMenuItem;//前景菜单 private JMenuItem backgroundMenuItem; private JMenuItem eraserMenuItem;//橡皮菜单 private JMenuItem exitMenuItem;//跳出菜单 private JMenuItem saveMenuItem;//保存菜单 private void init() { /** * 略略略略略略略 */ //添加菜单栏 JMenuBar menuBar=new JMenuBar();//创建菜单栏 setJMenuBar(menuBar);//窗体载入菜单栏 //系统内容 JMenu systemMenu =new JMenu("系统");//初始化菜单对象,并添加文本内容 menuBar.add(systemMenu);//菜单栏添加菜单对象 saveMenuItem=new JMenuItem("保存"); systemMenu.add(saveMenuItem);//菜单添加菜单项 systemMenu.addSeparator();//添加分割线 exitMenuItem =new JMenu("退出");// systemMenu.add(exitMenuItem); JMenu strokeMenu=new JMenu("线型");//初始菜单对象,并添加文本内容 menuBar.add(strokeMenu);//菜单添加菜单对象 strokeMenuItem1 =new JMenuItem("细线"); strokeMenu.add(strokeMenuItem1); strokeMenuItem2 =new JMenuItem("粗线"); strokeMenu.add(strokeMenuItem2); strokeMenuItem3 =new JMenuItem("较粗"); strokeMenu.add(strokeMenuItem3); JMenu colorMenu =new JMenu("颜色"); menuBar.add(colorMenu); foregroundMenuItem=new JMenuItem("画笔颜色"); colorMenu.add(foregroundMenuItem); backgroundMenuItem=new JMenuItem("背景颜色"); colorMenu.add(backgroundMenuItem); JMenu editMenu =new JMenu("编辑"); menuBar.add(editMenu); clearMenuItem =new JMenuItem("清除"); editMenu.add(clearMenuItem); eraserMenuItem =new JMenuItem("橡皮"); editMenu.add(eraserMenuItem); }//init()结束 /** * 为组件添加鼠标移动事件监听 */ private void addListener() { /** * 菜单监听,基本和前面的一样,修改为saveMenuItem. */ saveMenuItem.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent argo) {//单击时 DrawImageUtil.saveImage(DrawPictureFrame.this,image);//打印图片:打印当前窗体(DrawPictureFrame.this)为图片 } }); //清除与橡皮按钮事件实现 clearMenuItem.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent arg0) { g.setColor(backgroundColor); g.fillRect(0,0,570,390);//画一个背景颜色的方形填满整个画布,实现清除功能 g.setColor(foreColor);//画图工具使用画笔颜色 canvas.repaint();//更新画布 } }); eraserMenuItem.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent arg0) { //单击按钮,使用橡皮 if (eraserButton.getText().equals("橡皮")) { rubber =true; //设置橡皮为true eraserButton.setText("画图");//改变按钮上的文字为画图 eraserMenuItem.setText("画图"); }else { rubber =false; //设置画笔为false eraserMenuItem.setText("橡皮");//改变菜单项的文本为橡皮 eraserButton.setText("橡皮"); g.setColor(foreColor);//设置绘图对象为画笔颜色 } } });//橡皮结束 //背景颜色 backgroundMenuItem.addActionListener(new ActionListener() {//背景色按钮添加动作监听:ActionListener public void actionPerformed(final ActionEvent arg0) { //单击时打开颜色对话框,参数依次为:父窗体,标题,默认选中的颜色(青色) Color bgColor =JColorChooser.showDialog(DrawPictureFrame.this,"颜色对话框",Color.CYAN); if (bgColor !=null) {//如果选中的颜色不是空的 backgroundColor=bgColor;//将选中的颜色赋给背景色变量 } //背景色按钮也更换为这种颜色 backgroundButton.setBackground(backgroundColor); g.setColor(backgroundColor);//绘图工具使用颜色 g.fillRect(0,0,570,390);//画一个背景颜色的方形填满整个画布 g.setColor(foreColor);//画图工具使用前景色 canvas.repaint();//更新画布 } });//backgroundButton.addActionListener结束 //画笔颜色--前景色 foregroundMenuItem.addActionListener(new ActionListener() {//背景色按钮添加动作监听:ActionListener public void actionPerformed(final ActionEvent arg0) { //单击时打开颜色对话框,参数依次为:父窗体,标题,默认选中的颜色(青色) Color bgColor =JColorChooser.showDialog(DrawPictureFrame.this,"颜色对话框",Color.CYAN); if (bgColor !=null) {//如果选中的颜色不是空的 backgroundColor=bgColor;//将选中的颜色赋给背景色变量 } //背景色按钮也更换为这种颜色 foregroundButton.setBackground(backgroundColor); g.setColor(backgroundColor);//绘图工具使用颜色 } }); strokeMenuItem1.addActionListener(new ActionListener() {//"细线“按钮添加动作监听 public void actionPerformed(final ActionEvent arg0) {//单击时 //声明画笔属性,粗细为1像素,线条末端无修饰,折线处呈尖角 BasicStroke bs =new BasicStroke(1,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER); g.setStroke(bs);//画图工具使用此画笔 strokeButton1.setSelected(true);//细线按钮为选中状态 } }); strokeMenuItem2.addActionListener(new ActionListener() {//"细线“按钮添加动作监听 public void actionPerformed(final ActionEvent arg0) {//单击时 //声明画笔属性,粗细为2像素,线条末端无修饰,折线处呈尖角 BasicStroke bs =new BasicStroke(2,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER); g.setStroke(bs);//画图工具使用此画笔 strokeButton2.setSelected(true); } }); strokeMenuItem3.addActionListener(new ActionListener() {//"细线“按钮添加动作监听 public void actionPerformed(final ActionEvent arg0) {//单击时 //声明画笔属性,粗细为3像素,线条末端无修饰,折线处呈尖角 BasicStroke bs =new BasicStroke(3,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER); g.setStroke(bs);//画图工具使用此画笔 strokeButton3.setSelected(true); } });//画笔结束 }//组件监听结束 以上功能展示:

灵魂画手

未完待续~



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3